package com.bbz.core.equals;

import java.util.Objects;

/**
 * 根据《Java核心技術》总结出最好的重写equals的方法
 *
 * @author binbin.zhang
 */
public class EqualsTest {
    private String name;
    private int age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int hashCode() {
        return name.hashCode() * 37 + age;
    }

    @Override
    public boolean equals(Object otherObject) {
        //检测this与otherObject是否引用同一个对象
        if (this == otherObject) {
            return true;
        }
        //检测otherObject是否为null
        if (otherObject == null) {
            return false;
        }
        //比较this与otherObject是否属于同一个类，如果equals的语义在每个子类中有所改变就使用getClass检测。
        if (getClass() != otherObject.getClass()) {
            return false;
        }
        //如果所有的子类都拥有统一的语义，就使用instanceof检测. instanceof 主要判断otherObject 是不是EqualsTest的实例 或者是它的子类。
        if (!(otherObject instanceof EqualsTest)) {
            return false;
        }
        //匹配所有field
        EqualsTest other = (EqualsTest) otherObject;
        return name == other.name && age == other.age;
    }
}
